/*
 * wiper.c
 *
 *  Created on: 15-03-2013
 *      Author: MCzepczyński
 */

/******************************************************************************************
 *	Deklaracje dołączanych plików nagłówkowych i bibliotek								 *
 *****************************************************************************************/
#include "wiper.h"

volatile uint16_t wiper_timer;


/******************************************************************************************
 *	Deklaracje funkcji															 		 *
 *****************************************************************************************/

/*
 * 	Funkcja sprawdzająca stan manetki wycieraczek
 *  Wynik: 0 - wycieraczki wylaczone
 *         1 - wycieraczki zalaczone na I bieg
 */
uint8_t check_wipers(void){
	if(!(WIPER_PIN & WIPER)){
		return 1;				// manetka załączona
	} else {
		return 0;				// manetka wyłączona
	}
}/* check_wipers */

/*
 * 	Funkcja sprawdzająca interwal czasowy manetki wycieraczek
 *  Wynik: 300 - 1300 - czas od 3 do 13 sekund
 */
uint16_t check_interval(void){
	uint16_t temp = 0;
	ADMUX |= (ADMUX & 0xF8) | 0;					// pomiar napięcia na kanale 0
	ADCSRA |= (1<<ADSC);							// rozpoczecie pomiaru

	while(ADCSRA & (1<<ADSC));						// odczekaj czas konwersji

	temp = ADCW;

	if(temp < (WIPER_POT_1 + WIPER_POT_DIFF)) temp = 300 + WIPER_CYCLE_TIME;													// poziom 1 - 3s
	else if((temp > (WIPER_POT_2 - WIPER_POT_DIFF)) && (temp < (WIPER_POT_2 + WIPER_POT_DIFF))) temp = 400 + WIPER_CYCLE_TIME;	// poziom 2 - 4s
	else if((temp > (WIPER_POT_3 - WIPER_POT_DIFF)) && (temp < (WIPER_POT_3 + WIPER_POT_DIFF))) temp = 600 + WIPER_CYCLE_TIME;	// poziom 3 - 6s
	else if((temp > (WIPER_POT_4 - WIPER_POT_DIFF)) && (temp < (WIPER_POT_4 + WIPER_POT_DIFF))) temp = 700 + WIPER_CYCLE_TIME;	// poziom 4 - 7s
	else if((temp > (WIPER_POT_5 - WIPER_POT_DIFF)) && (temp < (WIPER_POT_5 + WIPER_POT_DIFF))) temp = 900 + WIPER_CYCLE_TIME;	// poziom 5 - 9s
	else if((temp > (WIPER_POT_6 - WIPER_POT_DIFF)) && (temp < (WIPER_POT_6 + WIPER_POT_DIFF))) temp = 1000 + WIPER_CYCLE_TIME;// poziom 6 - 10s
	else if((temp > (WIPER_POT_6 + WIPER_POT_DIFF)) && (temp < WIPER_POT_7)) temp = 1200 + WIPER_CYCLE_TIME;					// poziom 7 - 12s
	else if(temp > WIPER_POT_7) temp = 1300 + WIPER_CYCLE_TIME;																// poziom 8 - 13s

	return temp;
}/* check_interval */

/*
 * 	Funkcja realizujaca dzialania wycieraczek
 */
void wipers(void){

	//static uint8_t wiper_status = 0, wiper_status_temp = 0;
//	enum states {idle, delay, check_imp, interval};

	switch (wiper_status){
		case idle:		if(check_wipers() && !wiper_timer){			// uruchomiono manetke
							WIPER_RELAY_ON;							// uruchomienie przekaźnika wycieraczek
							wiper_timer = WIPER_RELAY_DELAY;		// odmierzanie czasu opoznienia wylaczenia przekaznika
							wiper_status_temp = wiper_status;		// zmienna tymczasowego statusu
							wiper_status = delay;					// przejscie do procedury "delay"
							w_stat = 1;
						}
						break;

		case delay:		if(!wiper_timer){						// minal czas 1s
							if(wiper_status_temp == idle){			// z jakiego statusu bylo wywolanie
								wiper_status = check_imp;			// przejscie do procedury "check_imp"
							} else{
								wiper_status = interval;			// przejscie do procedury "interval"
								WIPER_RELAY_OFF;
								wiper_timer = check_interval();
								w_stat = 0;
							}
						}
						break;

		case check_imp:	WIPER_RELAY_OFF;						// wyłączenie przekaznika
						if(check_wipers()){						// manetka podtrzymana
							wiper_status = interval;			// przejscie do procedury "interval"
							wiper_timer = check_interval();
						} else{
							wiper_timer = 200;					// odczekanie pelnego cyklu wycieraczek
							wiper_status = idle;				// powrót do procedury "idle"
						}
						w_stat = 0;
						break;

		case interval:	if(!wiper_timer){					// minal czas ostawiony na manetce
							if(check_wipers()){					// manetka podtrzymana
								WIPER_RELAY_ON;					// uruchomienie przekaznika wycieraczek
								wiper_status_temp = wiper_status;		// zmienna tymczasowa statusu
								wiper_timer = WIPER_RELAY_DELAY;	// konfiguracja timera do odmierzenia czasu opoznienia przekaznika
								wiper_status = delay;			// przejscie do procedury "delay"
							} else{
								wiper_status = idle;			// powrot do procedury "idle"
							}
						}
						break;
		}
}/* wipers */

/*
 * 	Funkcja realizująca normalną funkcję wycieraczek
 */
void wipers_default(void){
	if(!(WIPER_PIN & WIPER)){
		WIPER_RELAY_ON;				// manetka załączona
	} else {
		WIPER_RELAY_OFF;				// manetka wyłączona
	}
}/* wipers_default */

/******************************************************************************************
 *	Koniec pliku wiper.c
 *****************************************************************************************/
